package com.controladores.controlvehicular.controlador;

import java.util.ArrayList;
import java.util.Calendar;

import com.controladores.controlvehicular.R;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Handler;
import android.os.Message;
import android.widget.Button;

public class Tiempo   {
	private Button botonEsp;
	private String horaLlegada, tiempoA, alarma; 
	private String valor="null";
	SoundManager snd;
	private SoundPool sp;
	int bien = 0, c1=0, c2=0, c3=0, c4=0, c5=0;
	private int cont=0,cont1=0,cont2=0,cont3=0,cont4=0,cont5=0;
	ArrayList<String> tipoMultas,tiemposMultas;
	ArrayList<Long> tiempoMultasEnSegundos;
	private long horaUsoEnSegundos,horaConTiempoGracia,horaConMinutosDeGracia,horaPrimerTipoSonido,horaPrimerTipo,horaSegundoTipoSonido,horaSegundoTipo,horaTercerTipoSonido,horaTercerTipo,horaCuartoTipoSonido,horaCuartoTipo,horaQuintoTipoSonido;

	
	
	public String retornarMulta(){
		return valor; 
	}
	
	public String retornarAlarma(){
		return alarma;
	}
	
	public void recibirComponente(Button componenteEspacio){
		this.botonEsp = componenteEspacio;
	}
	
	

	public void traerDatos(Button boton, String horaLL, String tiempoU, ArrayList<String> desdeMultas,ArrayList<String> tiempoMultas/*, int color1*/) {
		this.botonEsp = boton;
		this.horaLlegada = horaLL;
		this.tiempoA = tiempoU;
		this.tipoMultas=desdeMultas;
		this.tiemposMultas= tiempoMultas;
		transformarTiemposEnSegundos();
		//this.color=color1;

	}
	
	public long convertirHoraASegundos(String horaAConvertir){
		String horaMinutoTiempoUso[]=horaAConvertir.split(":");
		int horaTiempoUso=Integer.parseInt(horaMinutoTiempoUso[0]);
		int minutoTiempoUso=Integer.parseInt(horaMinutoTiempoUso[1]);
		long minutosEnSegundos=minutoTiempoUso*60;
		long horaEnSegundos=horaTiempoUso*3600;
		long segundos=minutosEnSegundos+horaEnSegundos;
		return segundos;
	}
	
	public long convertirTiemposDeMultasEnSegundos(long minutosMultas){
		long segundosObtenidos = minutosMultas*60;
		return segundosObtenidos;
	}
	
	public void transformarTiemposEnSegundos(){
		System.out.println("hora de llegada "+horaLlegada+" tiempoUso "+ tiempoA);
		tiempoMultasEnSegundos=new ArrayList<Long>();
		String horaFin[]=obtenerHora(horaLlegada, Integer.parseInt(tiempoA));
		String horaFinS=horaFin[0]+":"+horaFin[1];
		
		horaUsoEnSegundos=convertirHoraASegundos(horaFinS);
		System.out.println("hora Fin sin tiempo de gracia "+horaUsoEnSegundos);
		horaConTiempoGracia=convertirHoraASegundos(horaFinS)+convertirTiemposDeMultasEnSegundos(15);
		horaConMinutosDeGracia= convertirHoraASegundos(horaFinS)+convertirTiemposDeMultasEnSegundos(5);
		//horaConRestoTiempoGracia=horaConMinutosDeGracia+convertirTiemposDeMultasEnSegundos(10);
		horaPrimerTipoSonido=horaConTiempoGracia+60;
		horaPrimerTipo=horaConTiempoGracia+(convertirTiemposDeMultasEnSegundos(Long.parseLong(tiemposMultas.get(0))));
		horaSegundoTipoSonido=horaPrimerTipo+60;
		horaSegundoTipo=horaPrimerTipo+(convertirTiemposDeMultasEnSegundos(Long.parseLong(tiemposMultas.get(1))));
		horaTercerTipoSonido=horaSegundoTipo+60;
		horaTercerTipo=horaSegundoTipo+(convertirTiemposDeMultasEnSegundos(Long.parseLong(tiemposMultas.get(2))));
		horaCuartoTipoSonido=horaTercerTipo+60;
		horaCuartoTipo=horaTercerTipo+convertirTiemposDeMultasEnSegundos(Long.parseLong(tiemposMultas.get(3)));
		horaQuintoTipoSonido=horaCuartoTipo+60;
		System.out.println("Hora con tiempo de gracia "+horaConTiempoGracia);
		System.out.println("Hora empiezo multa 1 "+horaPrimerTipoSonido);
		System.out.println("Hora fin multa 1 "+horaPrimerTipo);
		System.out.println("Hora empiezo multa 2 "+horaSegundoTipoSonido);
		System.out.println("Hora fin multa 2 "+horaSegundoTipo);
		System.out.println("Hora empiezo multa 3 "+horaTercerTipoSonido);
		System.out.println("Hora fin multa 3 "+horaTercerTipo);
		System.out.println("Hora empiezo multa 4 "+horaCuartoTipoSonido);
		System.out.println("Hora fin multa 4 "+horaCuartoTipo);
		System.out.println("Hora empiezo multa 5 "+horaQuintoTipoSonido);

	}

	public String[] obtenerHora(String horaLlegadaRegistro, int tiempo) {
		int horaSalida=0;
		int minutosSalida=0;
		int valorTiempo=0;
		String[] horaMinutos;
		String [] horaObtenida=new String[2];
		int division = 0;
		int residuo = 0;
		horaMinutos = horaLlegadaRegistro.split(":");
		valorTiempo = tiempo;
		int hora = Integer.parseInt(horaMinutos[0]);
		int minutos = Integer.parseInt(horaMinutos[1]);
		if (valorTiempo >= 60) {
			division = valorTiempo / 60;
			residuo = valorTiempo % 60;
			horaSalida = hora + division;
			minutosSalida = minutos + residuo;
			if (minutosSalida >= 60) {
				division = minutosSalida / 60;
				residuo = minutosSalida % 60;
				horaSalida = horaSalida + division;
				minutosSalida = residuo;
			}
		} else {
			minutosSalida = minutos + valorTiempo;
			if (minutosSalida >= 60) {
				division = minutosSalida / 60;
				residuo = minutosSalida % 60;
				horaSalida = hora + division;
				minutosSalida = residuo;
			} else {
				horaSalida = hora;
			}
		}
		horaSalida = transformarHora(horaSalida);
		horaObtenida[0]=String.valueOf(horaSalida);
		horaObtenida[1]=String.valueOf(minutosSalida);
		return horaObtenida;
	}

	public int transformarHora(int horaAT) {
		
		if (horaAT > 23) {
			horaAT = horaAT - 24;
		}
		return horaAT;
	}
	
	
	@SuppressLint("HandlerLeak")
	Handler puente = new Handler() {
		  @Override
		  public void handleMessage(Message msg) {
		   String alarmaColor=String.valueOf(msg.obj);
		   System.out.println("si entro al handler "+alarmaColor);
		   if (alarmaColor.compareTo("En 10 minutos se acaba el tiempo") == 0) {
			   System.out.println("si llego mensaje en 10 minutos");
				botonEsp.getBackground().setColorFilter(Color.argb(255, 255, 200, 0), PorterDuff.Mode.MULTIPLY);
				cont=cont+1;
				valor="null";
				if (bien != 0&&cont<=2) {
					sp.play(bien, 1, 1, 0, 0, 1);
					sp.stop(bien);
				}

			}
			
			if(alarmaColor.compareTo("Alerta naranja")==0){
				botonEsp.getBackground().setColorFilter(Color.argb(255, 255, 200, 0), PorterDuff.Mode.MULTIPLY);
				valor="null";

			}
			
			if(alarmaColor.compareTo("Sonido multa uno")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				cont1=cont1+1;
				valor=tipoMultas.get(0); //desde 16
				if (bien != 0&&cont1<=2) {
					sp.play(bien, 1, 1, 0, 0, 1);
					sp.stop(bien);
				}
			}

			if(alarmaColor.compareTo("Primera multa")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				valor=tipoMultas.get(0); //desde 16
			}
			
			if(alarmaColor.compareTo("Sonido multa dos")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				valor=tipoMultas.get(1); //desde 31
				cont2=cont2+1;
				if (bien != 0&&cont2<=2) {
					sp.play(bien, 1, 1, 0, 0, 1);
					sp.stop(bien);
				}
			}
			
			if(alarmaColor.compareTo("Segunda multa")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				valor=tipoMultas.get(1); //desde 31
			}
			
			if(alarmaColor.compareTo("Sonido multa tres")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				cont3=cont3+1;
				valor=tipoMultas.get(2); //desde 61
				if (bien != 0&&cont3<=2) {
					sp.play(bien, 1, 1, 0, 0, 1);
					sp.stop(bien);
				}
			}
			
			if(alarmaColor.compareTo("Tercera multa")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				valor=tipoMultas.get(2); //desde 61
			}
			
			if(alarmaColor.compareTo("Sonido multa cuatro")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				cont4=cont4+1;
				valor=tipoMultas.get(3); //desde 121
				if (bien != 0&&cont4<=2) {
					sp.play(bien, 1, 1, 0, 0, 1);
					sp.stop(bien);
				}
			}
			
			if(alarmaColor.compareTo("Cuarta multa")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				valor=tipoMultas.get(3); //desde 121
			}
			
			if(alarmaColor.compareTo("Sonido multa cinco")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				valor=tipoMultas.get(4); //desde 181
				cont5=cont5+1;
				if (bien != 0&&cont5<=2) {
					sp.play(bien, 1, 1, 0, 0, 1);
					sp.stop(bien);
				}
			}
			
			
			if(alarmaColor.compareTo("Quinta multa")==0){
				botonEsp.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);
				valor=tipoMultas.get(4); //desde 181
			}
		  }
	};
	
	
	public void loadCargarAlarmaSonora(Context context) {
		sp = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);
		bien = sp.load(context, R.raw.pickup, 1);
	}
	
	public Thread tareasEnSegundoPlano(){
		
	Thread th1 = new Thread(new Runnable() {
		       @Override
		       public void run() {
		    	   while (! Thread.currentThread().isInterrupted()) {
		    		   controlarTiempos();
		    		   Message msg = new Message();
		    		   msg.obj=alarma;
		    		   puente.sendMessage(msg);
		    		   try {
		                    Thread.sleep(1000);
		                } catch (InterruptedException e) {
		                    Thread.currentThread().interrupt();
		                }
		    	   }
		    	  
		    	  
		    	  
		       }
		}); 
	//th1.start();
	return th1;
	
	}
	

	public void controlarTiempos(){
		Calendar c = Calendar.getInstance();
		String horaSistema = c.get(Calendar.HOUR_OF_DAY) + ":"
				+ c.get(Calendar.MINUTE);
		long horaSistemaEnSegundos=convertirHoraASegundos(horaSistema);
		System.out.println("hora del Sistema en Segundos "+horaSistemaEnSegundos+" hora Llegada mas los minutos de gracias en segundos "+horaConTiempoGracia);
		if(horaSistemaEnSegundos>horaConTiempoGracia){
			if(horaSistemaEnSegundos<=horaPrimerTipo&&horaSistemaEnSegundos>horaConTiempoGracia){
				alarma="Primera multa";
				if(horaSistemaEnSegundos==horaPrimerTipoSonido){
					alarma="Sonido multa uno";
				}
				
			}else{
				if(horaSistemaEnSegundos>horaPrimerTipo&&horaSistemaEnSegundos<=horaSegundoTipo){
					alarma="Segunda multa";
					if(horaSistemaEnSegundos==horaSegundoTipoSonido){
						alarma="Sonido multa dos";
					}
				}else{
					if(horaSistemaEnSegundos>horaSegundoTipo&&horaSistemaEnSegundos<=horaTercerTipo){
						alarma="Tercera multa";
						if(horaSistemaEnSegundos==horaTercerTipoSonido){
							alarma="Sonido multa tres";
						}
					}else{
						if(horaSistemaEnSegundos>horaTercerTipo&&horaSistemaEnSegundos<=horaCuartoTipo){
							alarma="Cuarta multa";
							if(horaSistemaEnSegundos==horaCuartoTipoSonido){
								alarma="Sonido multa cuatro";
							}
						}else{
							if(horaSistemaEnSegundos>horaCuartoTipo){
								alarma="Quinta multa";
								if(horaSistemaEnSegundos==horaQuintoTipoSonido){
									alarma="Sonido multa cinco";
								}
							}
						}
					}
				}
			}

		}else{
			if(/*horaSistemaEnSegundos>horaUsoEnSegundos&&*/horaSistemaEnSegundos==horaConMinutosDeGracia){
				alarma="En 10 minutos se acaba el tiempo";
			}else{
				if(horaSistemaEnSegundos>horaConMinutosDeGracia/*&&horaSistemaEnSegundos<=horaConTiempoGracia*/){
					alarma="Alerta naranja";
				}
			}
		}
	}
	
	/*class ActualizaVista implements Runnable {
		 
        public void run() {
            while (! Thread.currentThread().isInterrupted()) {
                // Enviar mensaje al handler para hacer invalidate
                Message message = new Message();
               
                try {
                	controlarTiempos();
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }
    }*/


	


}
